﻿
        /* 知识点：二维数组声明与初始化
           语法：数据类型[,] 数组名 = new 数据类型[行数,列数] {初始化数据}; 
           特点：所有行必须有相同的列数 */
        
        // 方式1：直接初始化（明确指定维度）
        int[,] matrix1 = new int[2, 3] 
        { 
            { 1, 2, 3 }, 
            { 4, 5, 6 } 
        };

        // 方式2：隐式初始化（编译器自动推断维度）
        int[,] matrix2 = 
        { 
            { 7, 8 }, 
            { 9, 10 }, 
            { 11, 12 } 
        };

        // 方式3：动态初始化（先声明空间，后赋值）
        int[,] matrix3 = new int[3, 2];
        matrix3[0, 0] = 100;
        matrix3[1, 1] = 200;

        // 打印数组
        Console.WriteLine("matrix1:");
        PrintArray(matrix1);
        Console.WriteLine("\nmatrix2:");
        PrintArray(matrix2);
        Console.WriteLine("\nmatrix3:");
        PrintArray(matrix3);

    //2.
    /* 知识点：
           - Length：获取数组总元素数（行数 × 列数）
           - GetLength(dimension)：获取指定维度的长度（0=行，1=列） */
        
        int[,] matrix = new int[4, 5];

        // 总元素数
        Console.WriteLine($"总元素数：{matrix.Length}"); // 输出20

        // 获取维度信息
        int rows = matrix.GetLength(0);    // 第一维度（行数）
        int cols = matrix.GetLength(1);    // 第二维度（列数）
        Console.WriteLine($"行数：{rows}, 列数：{cols}"); // 输出4,5


//3.

 /* 知识点：
           - Array.Sort() 只能直接排序一维数组
           - 二维数组需要提取单行处理 */
        
        int[,] matrix4 = 
        { 
            { 5, 9, 2 }, 
            { 7, 1, 3 }, 
            { 4, 8, 6 } 
        };

        // 提取第二行（索引1）进行排序
        int rowIndex = 1;
        int[] tempRow = new int[matrix4.GetLength(1)];
        for (int j = 0; j < matrix4.GetLength(1); j++)
        {
            tempRow[j] = matrix4[rowIndex, j];
        }

        // 排序临时数组
        Array.Sort(tempRow); // 默认升序排序

        // 将排序后的数据写回原数组
        for (int j = 0; j < tempRow.Length; j++)
        {
            matrix4[rowIndex, j] = tempRow[j];
        }

        Console.WriteLine("第二行排序后：");
        PrintArray(matrix4);

//4.
    /* 知识点：
           - Array.Reverse() 反转一维数组元素顺序
           - 二维数组需要逐行处理 */
        
        int[,] matrix5 = 
        { 
            { 1, 2 }, 
            { 3, 4 }, 
            { 5, 6 } 
        };

        // 反转第一行（索引0）
        int[] tempRow1 = { matrix5[0, 0], matrix5[0, 1] };
        Array.Reverse(tempRow1);
        matrix5[0, 0] = tempRow1[0];
        matrix5[0, 1] = tempRow1[1];

        Console.WriteLine("第一行反转后：");
        PrintArray(matrix5);

//5.
/* 知识点：
           - Array.IndexOf() 只能用于一维数组
           - 二维数组需要手动遍历查找 */
        
        int[,] matrix6 = 
        { 
            { 10, 20 }, 
            { 30, 40 }, 
            { 50, 60 } 
        };
        int target = 40;

        // 方法1：手动遍历
        bool found = false;
        for (int i = 0; i < matrix6.GetLength(0); i++)
        {
            for (int j = 0; j < matrix6.GetLength(1); j++)
            {
                if (matrix6[i, j] == target)
                {
                    Console.WriteLine($"找到{target}，位置：[{i},{j}]");
                    found = true;
                    break;
                }
            }
            if (found) break;
        }

//6.
 /* 知识点：
           - Array.Copy(源数组, 目标数组, 复制长度)
           - 多维数组按行优先顺序复制 */
        
        int[,] source = 
        { 
            { 1, 2 }, 
            { 3, 4 } 
        };
        int[,] dest = new int[3, 3]; // 更大的数组

        // 复制全部元素（6个元素：2行×2列）
        Array.Copy(source, dest, source.Length);

        Console.WriteLine("复制结果：");
        PrintArray(dest);

//7.
/* 知识点：
           - Array.Clear(数组, 起始索引, 清除长度)
           - 将元素重置为默认值（int→0，bool→false） */
        
        int[,] matrix7 = 
        { 
            { 5, 9, 2 }, 
            { 7, 1, 3 } 
        };

        // 清空第二行（索引1）的前2个元素
        int startIndex = matrix7.GetLength(1) * 1; // 第二行起始索引：3
        int clearLength = 2;
        Array.Clear(matrix7, startIndex, clearLength);

        Console.WriteLine("部分清空后：");
        PrintArray(matrix7);

        // 打印二维数组的通用方法
        //GetLength(dimension)：获取指定维度的长度（0=行，1=列）
    static void PrintArray(int[,] arr)
    {
        for (int i = 0; i < arr.GetLength(0); i++)
        {
            for (int j = 0; j < arr.GetLength(1); j++)
            {
                Console.Write(arr[i, j].ToString().PadLeft(4));
            }
            Console.WriteLine();
        }
    }